home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 40
/
Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso
/
Aminet
/
util
/
boot
/
BlizKick.lha
/
BlizKick
/
Modules
/
SCSIDEV43.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-09-04
|
6KB
|
304 lines
; FILE: Source:modules/SCSIDEV43.ASM REV: 7 --- Install V43 scsi.device
;
; Plant V43 scsi.device -Module
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; This patch module will install V43 scsi.device replacing one inside
; kickstart. It will also disable beta message of the scsi.device :)
;
; Device will be loaded from file "devs:scsi43.device".
;
; This module can't install A4000T_scsidisk 43.34 because it uses
; several hunks. Use V44 SetPatch + AmigaOS ROM Update to load it
; instead.
;
; This module has been tested with following scsi.device (a300.ld.strip)
; versions:
;
; 43.11 (3.9.96) Works fine for me.
; 43.17 (12.5.97) Works, but doesn't recognize my drives! :(
; 43.18 (15.6.97) Works fine.
; 43.23 (7.11.97) Works fine.
; 43.24 (9.11.98) Works fine.
; 43.34 (21.12.99) Works fine.
;
; Written by Harry Sintonen.
; This source code is Public Domain.
;
incdir "include:" ; Some required...
include "exec/types.i"
include "exec/libraries.i"
include "blizkickmodule.i"
SCSI_MAXSIZE EQU 17352+4096
_LVOCopyMem EQU -$270
_LVOIoErr EQU -$84
_LVOLoadSeg EQU -$96
_LVOUnLoadSeg EQU -$9C
_LVOSetIoErr EQU -$1CE
call MACRO
jsr (_LVO\1,a6)
ENDM
SECTION PATCH,CODE
_DUMMY_LABEL
BK_PTC
; Code is run with following incoming parameters:
;
; a0=ptr to ROM start (buffer) eg. $1DE087B8
; a1=ptr to ROM start (ROM) eg. $00F80000 (do *not* access!)
; d0=ROM lenght in bytes eg. $00080000
; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
; CALL: jsr (a2)
; IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
; OUT: d0=ptr to resident (buf) or NULL
; a3=ptr to _InstallModule routine (can be used to plant a "module"):
; CALL: jsr (a3)
; IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
; OUT: d0=success
; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
; CALL: jsr (a4)
; IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
; OUT: -
; d6=dosbase, a6=execbase
;
; Code should return:
;
; d0=true if succeeded, false if failed.
; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
; NOTE: Kickstart *is* 2.0+
cmp.w #39,($C,a0) ; Requires KS ROM V3.1+
bhs.b .go
moveq #0,d0
rts
.go movem.l d0/a0-a1,-(sp)
moveq #0,d7
lea (_scsiname,pc),a1 ; _FindResident
jsr (a2)
tst.l d0
beq .xit
move.l d0,a5 ; a5=scsi.device resident
moveq #1,d7
move.l (RT_IDSTRING,a5),a0
sub.l (2*4,sp),a0 ;[a1]
add.l (1*4,sp),a0 ;[a0]
lea (_hdiname,pc),a1
moveq #12-1,d1 ; 'IDE_scsidisk'
.cmp move.b (a0)+,d0
cmp.b (a1)+,d0
dbne d1,.cmp
tst.w d1 ; Test if already installed
bmi .xit
moveq #0,d7
moveq #-1,d4 ; IoErr=-1 (default)
exg d6,a6
lea (_hddname,pc),a0
move.l a0,d1
call LoadSeg
move.l d0,d5
beq .exit
move.l d5,a2
add.l a2,a2
add.l a2,a2
tst.l (a2)+ ; Requires single hunk exe!
bne .baddie ; a2=hunk start
moveq #127,d0 ; Find resident:
move.w #$4AFC,d1
move.l a2,a0
.findrt cmp.w (a0)+,d1
dbeq d0,.findrt
tst.w d0
bmi .baddie
subq.l #2,a0
cmp.l (RT_MATCHTAG,a0),a0
bne.b .findrt
tst.b (RT_FLAGS,a0) ; Allow no RTF_AUTOINIT
bmi .baddie
; a0=residenttag (loadsed), a2=1st seg start
bsr makepcrel
; a0=residenttag (loadsed), a2=1st seg start
bsr disablebeta
lea (_buf,pc),a1
move.l #BKMODULE_ID,(a1)+ ; bkm_ID
move.l #(0)<<16!RTC_MATCHWORD,(a1)+ ; bkm_Flags RT_MATCHWORD
clr.l (a1)+ ; RT_MATCHTAG
moveq #RT_SIZE,d0
add.l (RT_ENDSKIP,a0),d0
sub.l a2,d0
cmp.l #SCSI_MAXSIZE,d0 ; Too big?
bhi.b .baddie ; It is quit!
move.l d0,(a1)+ ; RT_ENDSKIP
move.l (RT_FLAGS,a0),(a1)+ ; RT_FLAGS,RT_VERSION,RT_TYPE,RT_PRI
moveq #RT_SIZE,d0
add.l (RT_NAME,a0),d0
sub.l a2,d0
move.l d0,(a1)+ ; RT_NAME
moveq #RT_SIZE,d0
add.l (RT_IDSTRING,a0),d0
sub.l a2,d0
move.l d0,(a1)+ ; RT_IDSTRING
moveq #RT_SIZE,d0
add.l (RT_INIT,a0),d0
sub.l a2,d0
move.l d0,(a1)+ ; RT_INIT
clr.w (a0) ; Kill old RT_MATCHWORD
movem.l a0-a1,-(sp)
move.l (RT_ENDSKIP,a0),d0
sub.l a2,d0
move.l a2,a0
exg d6,a6 ;ex6--
call CopyMem
movem.l (sp)+,a0-a1
; IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
movem.l (sp),d0/a0 ;[d0][a0]
lea (_buf,pc),a1
move.w ($C,a0),d1 ; Kludge fix kick version to scsi version...
move.b (bkm_ResTag+RT_VERSION,a1),($C+1,a0)
jsr (a3) ; _InstallModule
move.w d1,($C,a0) ; Restore kick version
exg d6,a6 ;--ex6
move.l d0,d7 ; set success flag
call IoErr
move.l d0,d4
lea (_nullstr,pc),a2
tst.l d7
beq.b .bskip2
;debug clr.w (a5) ; Kill ROM scsi.device ROMTag :)
.baddie lea (_error2,pc),a2
.bskip2 move.l d5,d1
call UnLoadSeg
bra.b .bskip
.exit lea (_error1,pc),a2 ; a0=fmt
.bskip
exg d6,a6
move.l d7,d0 ; Valid counter?
bne.b .xit
move.l a2,a0 ; a0=fmt
pea (_hddname,pc)
move.l sp,a1 ; a1=array
jsr (a4) ; Call _Printf
addq.l #4,sp
move.l d4,d1
addq.l #1,d4
beq.b .skip
exg d6,a6
call SetIoErr
.skip
moveq #0,d0 ; Return fail
.xit lea (3*4,sp),sp
rts
; a0=residenttag (loadsed), a2=1st seg start
makepcrel move.l a0,-(sp)
move.l (RT_ENDSKIP,a0),d3 ;d3=max
move.l a2,d2 ;d2=min
move.l a2,a0
.mpcloop addq.l #2,a0
cmp.l a0,d3
bls.b .mpcldone
move.l (a0),d0
cmp.l d0,d2
bhi.b .mpcloop
cmp.l d0,d3
bls.b .mpcloop
move.l (-2,a0),d1
cmp.l #$4EB90000,d1 ; jsr abs.l -> jsr asb(pc); nop
bne.b .mpcs0
sub.l a0,d0
move.w #$4EBA,(-2,a0)
move.w d0,(a0)+
move.w #$2048,(a0) ; move.l a0,a0 (nop)
;bra.b .mpcloop
.mpcs0
bra.b .mpcloop
.mpcldone
move.l (sp)+,a0
rts
; a0=residenttag (loadsed), a2=1st seg start
disablebeta move.l a0,-(sp)
moveq #-(5*4),d3
add.l (RT_ENDSKIP,a0),d3 ;d3=max
move.l (RT_INIT,a0),d2 ;d2=min
move.l d2,a0
move.l #$48E7C0C0,d1 ;preload
.loop addq.l #2,a0
cmp.l a0,d3
bls.b .done
cmp.l (a0),d1
bne.b .loop
cmp.w #$206D,(4,a0)
bne.b .loop
tst.b (6,a0)
bne.b .loop
move.l (8,a0),d0
and.l #$FFFFFFF0,d0
cmp.l #$224E7000,d0
bne.b .loop
cmp.w #$6100,(12,a0)
bne.b .loop
cmp.l #$4CDF0303,(16,a0)
bne.b .loop
move.w #$6012,(a0) ;skip it!
.done
move.l (sp)+,a0
rts
_scsiname dc.b 'scsi.device',0
_hdiname dc.b 'IDE_scsidisk',0
_hddname dc.b 'devs:scsi43.device',0
_error1 dc.b 'Couldn''t load "%s"!',10,0
_error2 dc.b 'Couldn''t utilize this %s version!',10,0
_nullstr EQU *-1
CNOP 0,4
_buf ds.b SCSI_MAXSIZE+bkm_ResTag+RT_SIZE
SECTION VERSION,DATA
dc.b '$VER: SCSIDEV43_PATCH 1.3 (8.1.00)',0